package com.corpgovernment.common.enums;

import com.ctrip.corp.obt.generic.utils.StringUtils;
import com.ctrip.corp.obt.generic.utils.CollectionUtils;

import java.util.ArrayList;
import java.util.List;

/**
 * 国籍枚举
 * http://doc.chacuo.net/iso-3166-1
 */
public enum NationalityEnum {

    /**
     * 安道尔
     */
    AD("AD", "安道尔"),
    /**
     * 阿联酋
     */
    AE("AE", "阿联酋"),
    /**
     * 阿富汗
     */
    AF("AF", "阿富汗"),
    /**
     * 安提瓜和巴布达
     */
    AG("AG", "安提瓜和巴布达"),
    /**
     * 安圭拉
     */
    AI("AI", "安圭拉"),
    /**
     * 阿尔巴尼亚
     */
    AL("AL", "阿尔巴尼亚"),
    /**
     * 亚美尼亚
     */
    AM("AM", "亚美尼亚"),
    /**
     * 安哥拉
     */
    AO("AO", "安哥拉"),
    /**
     * 南极洲
     */
    AQ("AQ", "南极洲"),
    /**
     * 阿根廷
     */
    AR("AR", "阿根廷"),
    /**
     * 美属萨摩亚
     */
    AS("AS", "美属萨摩亚"),
    /**
     * 奥地利
     */
    AT("AT", "奥地利"),
    /**
     * 澳大利亚
     */
    AU("AU", "澳大利亚"),
    /**
     * 阿鲁巴
     */
    AW("AW", "阿鲁巴"),
    /**
     * 奥兰群岛
     */
    AX("AX", "奥兰群岛"),
    /**
     * 阿塞拜疆
     */
    AZ("AZ", "阿塞拜疆"),
    /**
     * 波黑
     */
    BA("BA", "波黑"),
    /**
     * 巴巴多斯
     */
    BB("BB", "巴巴多斯"),
    /**
     * 孟加拉
     */
    BD("BD", "孟加拉"),
    /**
     * 比利时
     */
    BE("BE", "比利时"),
    /**
     * 布基纳法索
     */
    BF("BF", "布基纳法索"),
    /**
     * 保加利亚
     */
    BG("BG", "保加利亚"),
    /**
     * 巴林
     */
    BH("BH", "巴林"),
    /**
     * 布隆迪
     */
    BI("BI", "布隆迪"),
    /**
     * 贝宁
     */
    BJ("BJ", "贝宁"),
    /**
     * 圣巴泰勒米岛
     */
    BL("BL", "圣巴泰勒米岛"),
    /**
     * 百慕大
     */
    BM("BM", "百慕大"),
    /**
     * 文莱
     */
    BN("BN", "文莱"),
    /**
     * 玻利维亚
     */
    BO("BO", "玻利维亚"),
    /**
     * 荷兰加勒比区
     */
    BQ("BQ", "荷兰加勒比区"),
    /**
     * 巴西
     */
    BR("BR", "巴西"),
    /**
     * 巴哈马
     */
    BS("BS", "巴哈马"),
    /**
     * 不丹
     */
    BT("BT", "不丹"),
    /**
     * 布韦岛
     */
    BV("BV", "布韦岛"),
    /**
     * 博茨瓦纳
     */
    BW("BW", "博茨瓦纳"),
    /**
     * 白俄罗斯
     */
    BY("BY", "白俄罗斯"),
    /**
     * 伯利兹
     */
    BZ("BZ", "伯利兹"),
    /**
     * 加拿大
     */
    CA("CA", "加拿大"),
    /**
     * 科科斯群岛
     */
    CC("CC", "科科斯群岛"),
    /**
     * 中非
     */
    CF("CF", "中非"),
    /**
     * 瑞士
     */
    CH("CH", "瑞士"),
    /**
     * 智利
     */
    CL("CL", "智利"),
    /**
     * 喀麦隆
     */
    CM("CM", "喀麦隆"),
    /**
     * 哥伦比亚
     */
    CO("CO", "哥伦比亚"),
    /**
     * 哥斯达黎加
     */
    CR("CR", "哥斯达黎加"),
    /**
     * 古巴
     */
    CU("CU", "古巴"),
    /**
     * 佛得角
     */
    CV("CV", "佛得角"),
    /**
     * 圣诞岛
     */
    CX("CX", "圣诞岛"),
    /**
     * 塞浦路斯
     */
    CY("CY", "塞浦路斯"),
    /**
     * 捷克
     */
    CZ("CZ", "捷克"),
    /**
     * 德国
     */
    DE("DE", "德国"),
    /**
     * 吉布提
     */
    DJ("DJ", "吉布提"),
    /**
     * 丹麦
     */
    DK("DK", "丹麦"),
    /**
     * 多米尼克
     */
    DM("DM", "多米尼克"),
    /**
     * 多米尼加
     */
    DO("DO", "多米尼加"),
    /**
     * 阿尔及利亚
     */
    DZ("DZ", "阿尔及利亚"),
    /**
     * 厄瓜多尔
     */
    EC("EC", "厄瓜多尔"),
    /**
     * 爱沙尼亚
     */
    EE("EE", "爱沙尼亚"),
    /**
     * 埃及
     */
    EG("EG", "埃及"),
    /**
     * 西撒哈拉
     */
    EH("EH", "西撒哈拉"),
    /**
     * 厄立特里亚
     */
    ER("ER", "厄立特里亚"),
    /**
     * 西班牙
     */
    ES("ES", "西班牙"),
    /**
     * 芬兰
     */
    FI("FI", "芬兰"),
    /**
     * 斐济群岛
     */
    FJ("FJ", "斐济群岛"),
    /**
     * 马尔维纳斯群岛（ 福克兰）
     */
    FK("FK", "马尔维纳斯群岛（福克兰）"),
    /**
     * 密克罗尼西亚联邦
     */
    FM("FM", "密克罗尼西亚联邦"),
    /**
     * 法罗群岛
     */
    FO("FO", "法罗群岛"),
    /**
     * 法国
     */
    FR("FR", "法国"),
    /**
     * 加蓬
     */
    GA("GA", "加蓬"),
    /**
     * 格林纳达
     */
    GD("GD", "格林纳达"),
    /**
     * 格鲁吉亚
     */
    GE("GE", "格鲁吉亚"),
    /**
     * 法属圭亚那
     */
    GF("GF", "法属圭亚那"),
    /**
     * 加纳
     */
    GH("GH", "加纳"),
    /**
     * 直布罗陀
     */
    GI("GI", "直布罗陀"),
    /**
     * 格陵兰
     */
    GL("GL", "格陵兰"),
    /**
     * 几内亚
     */
    GN("GN", "几内亚"),
    /**
     * 瓜德罗普
     */
    GP("GP", "瓜德罗普"),
    /**
     * 赤道几内亚
     */
    GQ("GQ", "赤道几内亚"),
    /**
     * 希腊
     */
    GR("GR", "希腊"),
    /**
     * 南乔治亚岛和南桑威奇群岛
     */
    GS("GS", "南乔治亚岛和南桑威奇群岛"),
    /**
     * 危地马拉
     */
    GT("GT", "危地马拉"),
    /**
     * 关岛
     */
    GU("GU", "关岛"),
    /**
     * 几内亚比绍
     */
    GW("GW", "几内亚比绍"),
    /**
     * 圭亚那
     */
    GY("GY", "圭亚那"),
    /**
     * 香港
     */
    HK("HK", "中国香港"),
    /**
     * 赫德岛和麦克唐纳群岛
     */
    HM("HM", "赫德岛和麦克唐纳群岛"),
    /**
     * 洪都拉斯
     */
    HN("HN", "洪都拉斯"),
    /**
     * 克罗地亚
     */
    HR("HR", "克罗地亚"),
    /**
     * 海地
     */
    HT("HT", "海地"),
    /**
     * 匈牙利
     */
    HU("HU", "匈牙利"),
    /**
     * 印尼
     */
    ID("ID", "印尼"),
    /**
     * 爱尔兰
     */
    IE("IE", "爱尔兰"),
    /**
     * 以色列
     */
    IL("IL", "以色列"),
    /**
     * 马恩岛
     */
    IM("IM", "马恩岛"),
    /**
     * 印度
     */
    IN("IN", "印度"),
    /**
     * 英属印度洋领地
     */
    IO("IO", "英属印度洋领地"),
    /**
     * 伊拉克
     */
    IQ("IQ", "伊拉克"),
    /**
     * 伊朗
     */
    IR("IR", "伊朗"),
    /**
     * 冰岛
     */
    IS("IS", "冰岛"),
    /**
     * 意大利
     */
    IT("IT", "意大利"),
    /**
     * 泽西岛
     */
    JE("JE", "泽西岛"),
    /**
     * 牙买加
     */
    JM("JM", "牙买加"),
    /**
     * 约旦
     */
    JO("JO", "约旦"),
    /**
     * 日本
     */
    JP("JP", "日本"),
    /**
     * 柬埔寨
     */
    KH("KH", "柬埔寨"),
    /**
     * 基里巴斯
     */
    KI("KI", "基里巴斯"),
    /**
     * 科摩罗
     */
    KM("KM", "科摩罗"),
    /**
     * 科威特
     */
    KW("KW", "科威特"),
    /**
     * 开曼群岛
     */
    KY("KY", "开曼群岛"),
    /**
     * 黎巴嫩
     */
    LB("LB", "黎巴嫩"),
    /**
     * 列支敦士登
     */
    LI("LI", "列支敦士登"),
    /**
     * 斯里兰卡
     */
    LK("LK", "斯里兰卡"),
    /**
     * 利比里亚
     */
    LR("LR", "利比里亚"),
    /**
     * 莱索托
     */
    LS("LS", "莱索托"),
    /**
     * 立陶宛
     */
    LT("LT", "立陶宛"),
    /**
     * 卢森堡
     */
    LU("LU", "卢森堡"),
    /**
     * 拉脱维亚
     */
    LV("LV", "拉脱维亚"),
    /**
     * 利比亚
     */
    LY("LY", "利比亚"),
    /**
     * 摩洛哥
     */
    MA("MA", "摩洛哥"),
    /**
     * 摩纳哥
     */
    MC("MC", "摩纳哥"),
    /**
     * 摩尔多瓦
     */
    MD("MD", "摩尔多瓦"),
    /**
     * 黑山
     */
    ME("ME", "黑山"),
    /**
     * 法属圣马丁
     */
    MF("MF", "法属圣马丁"),
    /**
     * 马达加斯加
     */
    MG("MG", "马达加斯加"),
    /**
     * 马绍尔群岛
     */
    MH("MH", "马绍尔群岛"),
    /**
     * 马其顿
     */
    MK("MK", "马其顿"),
    /**
     * 马里
     */
    ML("ML", "马里"),
    /**
     * 缅甸
     */
    MM("MM", "缅甸"),
    /**
     * 澳门
     */
    MO("MO", "中国澳门"),
    /**
     * 马提尼克
     */
    MQ("MQ", "马提尼克"),
    /**
     * 毛里塔尼亚
     */
    MR("MR", "毛里塔尼亚"),
    /**
     * 蒙塞拉特岛
     */
    MS("MS", "蒙塞拉特岛"),
    /**
     * 马耳他
     */
    MT("MT", "马耳他"),
    /**
     * 马尔代夫
     */
    MV("MV", "马尔代夫"),
    /**
     * 马拉维
     */
    MW("MW", "马拉维"),
    /**
     * 墨西哥
     */
    MX("MX", "墨西哥"),
    /**
     * 马来西亚
     */
    MY("MY", "马来西亚"),
    /**
     * 纳米比亚
     */
    NA("NA", "纳米比亚"),
    /**
     * 尼日尔
     */
    NE("NE", "尼日尔"),
    /**
     * 诺福克岛
     */
    NF("NF", "诺福克岛"),
    /**
     * 尼日利亚
     */
    NG("NG", "尼日利亚"),
    /**
     * 尼加拉瓜
     */
    NI("NI", "尼加拉瓜"),
    /**
     * 荷兰
     */
    NL("NL", "荷兰"),
    /**
     * 挪威
     */
    NO("NO", "挪威"),
    /**
     * 尼泊尔
     */
    NP("NP", "尼泊尔"),
    /**
     * 瑙鲁
     */
    NR("NR", "瑙鲁"),
    /**
     * 阿曼
     */
    OM("OM", "阿曼"),
    /**
     * 巴拿马
     */
    PA("PA", "巴拿马"),
    /**
     * 秘鲁
     */
    PE("PE", "秘鲁"),
    /**
     * 法属波利尼西亚
     */
    PF("PF", "法属波利尼西亚"),
    /**
     * 巴布亚新几内亚
     */
    PG("PG", "巴布亚新几内亚"),
    /**
     * 菲律宾
     */
    PH("PH", "菲律宾"),
    /**
     * 巴基斯坦
     */
    PK("PK", "巴基斯坦"),
    /**
     * 波兰
     */
    PL("PL", "波兰"),
    /**
     * 皮特凯恩群岛
     */
    PN("PN", "皮特凯恩群岛"),
    /**
     * 波多黎各
     */
    PR("PR", "波多黎各"),
    /**
     * 巴勒斯坦
     */
    PS("PS", "巴勒斯坦"),
    /**
     * 帕劳
     */
    PW("PW", "帕劳"),
    /**
     * 巴拉圭
     */
    PY("PY", "巴拉圭"),
    /**
     * 卡塔尔
     */
    QA("QA", "卡塔尔"),
    /**
     * 留尼汪
     */
    RE("RE", "留尼汪"),
    /**
     * 罗马尼亚
     */
    RO("RO", "罗马尼亚"),
    /**
     * 塞尔维亚
     */
    RS("RS", "塞尔维亚"),
    /**
     * 俄罗斯
     */
    RU("RU", "俄罗斯"),
    /**
     * 卢旺达
     */
    RW("RW", "卢旺达"),
    /**
     * 所罗门群岛
     */
    SB("SB", "所罗门群岛"),
    /**
     * 塞舌尔
     */
    SC("SC", "塞舌尔"),
    /**
     * 苏丹
     */
    SD("SD", "苏丹"),
    /**
     * 瑞典
     */
    SE("SE", "瑞典"),
    /**
     * 新加坡
     */
    SG("SG", "新加坡"),
    /**
     * 斯洛文尼亚
     */
    SI("SI", "斯洛文尼亚"),
    /**
     * 斯瓦尔巴群岛和 扬马延岛
     */
    SJ("SJ", "斯瓦尔巴群岛和扬马延岛"),
    /**
     * 斯洛伐克
     */
    SK("SK", "斯洛伐克"),
    /**
     * 塞拉利昂
     */
    SL("SL", "塞拉利昂"),
    /**
     * 圣马力诺
     */
    SM("SM", "圣马力诺"),
    /**
     * 塞内加尔
     */
    SN("SN", "塞内加尔"),
    /**
     * 索马里
     */
    SO("SO", "索马里"),
    /**
     * 苏里南
     */
    SR("SR", "苏里南"),
    /**
     * 南苏丹
     */
    SS("SS", "南苏丹"),
    /**
     * 圣多美和普林西比
     */
    ST("ST", "圣多美和普林西比"),
    /**
     * 萨尔瓦多
     */
    SV("SV", "萨尔瓦多"),
    /**
     * 叙利亚
     */
    SY("SY", "叙利亚"),
    /**
     * 斯威士兰
     */
    SZ("SZ", "斯威士兰"),
    /**
     * 特克斯和凯科斯群岛
     */
    TC("TC", "特克斯和凯科斯群岛"),
    /**
     * 乍得
     */
    TD("TD", "乍得"),
    /**
     * 多哥
     */
    TG("TG", "多哥"),
    /**
     * 泰国
     */
    TH("TH", "泰国"),
    /**
     * 托克劳
     */
    TK("TK", "托克劳"),
    /**
     * 东帝汶
     */
    TL("TL", "东帝汶"),
    /**
     * 突尼斯
     */
    TN("TN", "突尼斯"),
    /**
     * 汤加
     */
    TO("TO", "汤加"),
    /**
     * 土耳其
     */
    TR("TR", "土耳其"),
    /**
     * 图瓦卢
     */
    TV("TV", "图瓦卢"),
    /**
     * 坦桑尼亚
     */
    TZ("TZ", "坦桑尼亚"),
    /**
     * 乌克兰
     */
    UA("UA", "乌克兰"),
    /**
     * 乌干达
     */
    UG("UG", "乌干达"),
    /**
     * 美国
     */
    US("US", "美国"),
    /**
     * 乌拉圭
     */
    UY("UY", "乌拉圭"),
    /**
     * 梵蒂冈
     */
    VA("VA", "梵蒂冈"),
    /**
     * 委内瑞拉
     */
    VE("VE", "委内瑞拉"),
    /**
     * 英属维尔京群岛
     */
    VG("VG", "英属维尔京群岛"),
    /**
     * 美属维尔京群岛
     */
    VI("VI", "美属维尔京群岛"),
    /**
     * 越南
     */
    VN("VN", "越南"),
    /**
     * 瓦利斯和富图纳
     */
    WF("WF", "瓦利斯和富图纳"),
    /**
     * 萨摩亚
     */
    WS("WS", "萨摩亚"),
    /**
     * 也门
     */
    YE("YE", "也门"),
    /**
     * 马约特
     */
    YT("YT", "马约特"),
    /**
     * 南非
     */
    ZA("ZA", "南非"),
    /**
     * 赞比亚
     */
    ZM("ZM", "赞比亚"),
    /**
     * 津巴布韦
     */
    ZW("ZW", "津巴布韦"),
    /**
     * 中国 内地
     */
    CN("CN", "中国大陆"),
    /**
     * 刚果（布）
     */
    CG("CG", "刚果（布）"),
    /**
     * 刚果（金）
     */
    CD("CD", "刚果（金）"),
    /**
     * 莫桑比克
     */
    MZ("MZ", "莫桑比克"),
    /**
     * 根西岛
     */
    GG("GG", "根西岛"),
    /**
     * 冈比亚
     */
    GM("GM", "冈比亚"),
    /**
     * 北马里亚纳群岛
     */
    MP("MP", "北马里亚纳群岛"),
    /**
     * 埃塞俄比亚
     */
    ET("ET", "埃塞俄比亚"),
    /**
     * 新喀里多尼亚
     */
    NC("NC", "新喀里多尼亚"),
    /**
     * 瓦努阿图
     */
    VU("VU", "瓦努阿图"),
    /**
     * 法属南部领地
     */
    TF("TF", "法属南部领地"),
    /**
     * 纽埃
     */
    NU("NU", "纽埃"),
    /**
     * 美国本土外小岛屿
     */
    UM("UM", "美国本土外小岛屿"),
    /**
     * 库克群岛
     */
    CK("CK", "库克群岛"),
    /**
     * 英国
     */
    GB("GB", "英国"),
    /**
     * 特立尼达和多巴哥
     */
    TT("TT", "特立尼达和多巴哥"),
    /**
     * 圣文森特和格林纳丁斯
     */
    VC("VC", "圣文森特和格林纳丁斯"),
    /**
     * 中国台湾
     */
    TW("TW", "中国台湾"),
    /**
     * 新西兰
     */
    NZ("NZ", "新西兰"),
    /**
     * 沙特阿拉伯
     */
    SA("SA", "沙特阿拉伯"),
    /**
     * 老挝
     */
    LA("LA", "老挝"),
    /**
     * 朝鲜 北朝鲜
     */
    KP("KP", "朝鲜北朝鲜"),
    /**
     * 韩国 南朝鲜
     */
    KR("KR", "韩国南朝鲜"),
    /**
     * 葡萄牙
     */
    PT("PT", "葡萄牙"),
    /**
     * 吉尔吉斯斯坦
     */
    KG("KG", "吉尔吉斯斯坦"),
    /**
     * 哈萨克斯坦
     */
    KZ("KZ", "哈萨克斯坦"),
    /**
     * 塔吉克斯坦
     */
    TJ("TJ", "塔吉克斯坦"),
    /**
     * 土库曼斯坦
     */
    TM("TM", "土库曼斯坦"),
    /**
     * 乌兹别克斯坦
     */
    UZ("UZ", "乌兹别克斯坦"),
    /**
     * 圣基茨和尼维斯
     */
    KN("KN", "圣基茨和尼维斯"),
    /**
     * 圣皮埃尔和密克隆
     */
    PM("PM", "圣皮埃尔和密克隆"),
    /**
     * 圣赫勒拿
     */
    SH("SH", "圣赫勒拿"),
    /**
     * 圣卢西亚
     */
    LC("LC", "圣卢西亚"),
    /**
     * 毛里求斯
     */
    MU("MU", "毛里求斯"),
    /**
     * 科特迪瓦
     */
    CI("CI", "科特迪瓦"),
    /**
     * 肯尼亚
     */
    KE("KE", "肯尼亚"),
    /**
     * 蒙古国 蒙古
     */
    MN("MN", "蒙古国蒙古"),
    ;

    private String code;
    private String desc;

    NationalityEnum(String code, String desc) {
        this.code = code;
        this.desc = desc;
    }

    public String getCode() {
        return code;
    }

    public String getDesc() {
        return desc;
    }

    /**
     * 根据code查找枚举
     *
     * @param code
     * @return
     */
    public static NationalityEnum getByCode(String code) {
        if (StringUtils.isEmpty(code)) {
            return null;
        }
        for (NationalityEnum e : NationalityEnum.values()) {
            if (code.equalsIgnoreCase(e.getCode())) {
                return e;
            }
        }
        return null;
    }

    /**
     * 根据desc查找枚举
     *
     * @param desc
     * @return
     */
    public static NationalityEnum getByDesc(String desc) {
        if (StringUtils.isEmpty(desc)) {
            return null;
        }
        for (NationalityEnum e : NationalityEnum.values()) {
            if (desc.equalsIgnoreCase(e.getDesc())) {
                return e;
            }
        }
        return null;
    }
}
